#ifndef RING_BUFFER
#define RING_BUFFER

#include <sys/types.h>
#include <pthread.h>


#ifndef bool
#define bool char
#endif // !bool

#ifndef true
#define true 1
#endif // !true

#ifndef false
#define false 0
#endif // !false

#ifndef OK
#define OK 0
#endif // !OK

#ifndef ERROR
#define ERROR -1
#endif // !ERROR




/* 编译前请确定这个参数 */
#define IS_THREAD_SAFE true

#ifdef cplusplus
extern "C"
{
#endif

#pragma pack(4)
/*循环缓冲区数据结构*/
typedef struct ringBuffer
{
    u_int8_t    *bufBase;   // 环型缓冲区地址
    int32_t     bufLen;     // 环型缓冲区大小,总大小，初始化之后就不变了
    /*当writeIdx=readIdx,缓冲区为空；writeIdx-readIdx=bufLen,缓冲区为满*/
    int32_t     writeIdx;   // 环型缓冲区写指针
    int32_t     readIdx;    // 环型缓冲区读指针
    int32_t     dataLen;    // 环型缓冲区内容长度
    pthread_mutex_t mutex;  // 环型缓冲区锁  
    pthread_cond_t read_cont;
    pthread_cond_t write_cont;
    bool        bSafe;      // 是否线程安全标志
}ringBuffer,*HANDLE;

/**
 *  Function:   ringBuf_init()
 *  Description:循环缓冲区初始化函数
 *  Access Level:   public
 *  Input:      bufSize--循环缓冲区大小
 *  Output:     N/A
 *  Return:     循环缓冲区句柄--成功/NULL--失败
 */
HANDLE ringBuf_init(int bufSize);

/**
 *  Function:   ringBuf_write()
 *  Description:循环缓冲区写入函数
 *  Input:      hRingBuf--循环缓冲区句柄
 *              pSrcBuf--待写入数据源地址
 *              len--待写入数据长度
 *  Output:     N/A
 *  Return:    实际写入数据的长度--成功/-1--失败
 */
int ringBuf_write(HANDLE hRingBuf,unsigned char *pSrcBuf,int len);

/**
 *  Function:   ringBuf_read()
 *  Description:循环缓冲区读取数据函数
 *  Input:      hRingBuf--循环缓冲区句柄
 *              pDstBuf--读取数据的目的地址
 *              len--待读取数据长度
 *  Output:     N/A
 *  Return:     实际读取数据的长度--成功/-1--失败
 */
int ringBuf_read(HANDLE hRingBuf,unsigned char* pDstBuf,int len);

/**
 *  Function:   ringBuf_dateLen()
 *  Description:获取循环缓冲区有效数据长度
 *  Input:      hRingBuf--循环缓冲区句柄
 *  Output:     N/A
 *  Return:     循环缓冲区有效数据长度--成功/-1--失败
 */
int ringBuf_dateLen(HANDLE hRingBuf);
/**
 *  Function:   ringBuf_destroy()
 *  Description:循环缓冲区销毁函数
 *  Input:      hRingBuf--循环缓冲区句柄地址
 *  Output:     N/A
 *  Return:     OK/ERROR
 */
int ringBuf_destroy(HANDLE *hRingBuf);
int ringBuf_bufferRemain(HANDLE hRingBuf);

#ifdef cplusplus
}
#endif

#endif